package com.netty.server.sender;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public interface Callback {
    /**
     * 收到响应的回调方法
     * 可以通过返回值控制是否继续接收
     * 注意！超时时间是按照总时间计算的，单纯接收一个响应是不会重置超时检测的
     *
     * @param req  发出的请求
     * @param resp 收到的响应
     * @return 请求是否完成。true: 完成，不再接收。false: 未完成，继续接收。
     */
    boolean onNext(CmdRequest req, CmdResponse resp);

    /**
     * 请求超时时的回调方法。
     *
     * @param req 请求
     */
    void onTimeout(CmdRequest req);

    /**
     * 异常回调
     * 暂未实装
     *
     * @param req 请求
     * @param ex  异常
     */
    default void onException(CmdRequest req, Throwable ex) {
        Logger logger = LoggerFactory.getLogger(this.getClass());
        logger.error(String.format("请求发送异常！cmd:%s; cmdId:%s", req.getData().getClass().getName(), req.getCmdId()), ex);
    }

    class EmptyCallback implements Callback {
        @Override
        public boolean onNext(CmdRequest req, CmdResponse resp) {
            return true;
        }

        @Override
        public void onTimeout(CmdRequest req) {

        }
    }

}
